﻿using AspectCore.DynamicProxy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JGSY.SerialCommunication.UpperComputer.Core.AOP.AspectCore
{
    /// <summary>
    /// AspectCore 实现AOP   AbstractInterceptorAttribute --> AspectCore.DynamicProxy
    /// </summary>
    public class LogAspectDNC : AbstractInterceptorAttribute
    {
        public override async Task Invoke(AspectContext context, AspectDelegate next)
        {
            try
            {
                // 前置通知
                Console.WriteLine($"方法 {context.ServiceMethod.Name} 开始执行，参数：{string.Join(", ", context.Parameters)}");

                // 执行目标方法
                await next(context);

                // 返回通知（可以获取返回值）
                Console.WriteLine($"方法 {context.ServiceMethod.Name} 执行完成，返回值：{context.ReturnValue}");
            }
            catch (Exception ex)
            {
                // 异常通知
                Console.WriteLine($"方法 {context.ServiceMethod.Name} 抛出异常：{ex.Message}");
                throw;
            }
            finally
            {
                // 后置通知
                Console.WriteLine($"方法 {context.ServiceMethod.Name} 最终处理完成");
            }
        }
    }
}
